.env
檔config/
資料夾Laravel 的設定檔位於 config/
資料夾,然而在介紹它之前,要先瞭解 .env
檔案。
.env
是一個常見的 environment variable 設定方式,藉由一個獨立的檔案避免每次都需要重新設定環境變數。
以 Laravel Installer 建立的專案應該已經包含一個 .env
檔案,如果沒有的話可以從 .env.example
中複製出來。
.env
位於 .gitignore 範圍下,如果是從其它專案 clone 下來可能會不包含 .env
一個合法的 .env
應該是如下範例的格式
APP_NAME=Laravel
APP_ENV=local
值得注意的是,.env
僅能使用 KEY=VALUE
格式,且都需要是字串型式。
如果 Value 字串中有包含空白,可以用 ""
將其包括起來。
APP_NAME="My First Laravel Project"
Laravel 所有的應用程式設定都位於 config/
資料夾,正常而言資料夾結構應如下所示:
$ tree config/
config
├── app.php
├── auth.php
├── broadcasting.php
├── cache.php
├── cors.php
├── database.php
├── filesystems.php
├── hashing.php
├── logging.php
├── mail.php
├── queue.php
├── services.php
├── session.php
└── view.php
0 directories, 14 files
以 config/app.php
為例,可能會看到以下內容
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Name
|--------------------------------------------------------------------------
|
| This value is the name of your application. This value is used when the
| framework needs to place the application's name in a notification or
| any other location as required by the application or its packages.
|
*/
'name' => env('APP_NAME', 'Laravel'),
// ...
]
我們可以利用 env()
這個函式去擷取 environment variable 的值:第一個參數代表 Key,第二個參數則表示若該 Key 不存在時使用的預設值。
env()
會同時取得目前系統中的 environment variable 及 .env
檔案的內容(相同參數的情況下,系統中 environment variable 的優先度大於 .env
)
config/
資料夾下使用 env()
函式,於專案中其它地方使用在某些設定下會有預期外的狀況發生。在 Laravel 應用程式中,可以利用 config()
取得設定檔中的值。
<?php
config('app.name', 'Laravel');
config()
的第一個參數表示設定值,第二個參數表示若設定值不存在的預設值。
第一個參數的規則比較複雜一些:以 .
為分隔,第一個 .
之前表示 config/
下的檔案名稱,第二個之後表示陣列的 Key,如果是多維陣列還可以再往下指定 Key。
<?php
// config/app.php
return [
'settings' => [
'foo' => true,
'bar' => [
'baz' => false,
],
],
];
config('app.settings.foo'); // true
config('app.settings.bar.baz'); // false
config('app.settings.miss'); // NULL
config('app.settings.miss', 'default'); // default
一般而言,我個人習慣會用 Docker 啟動外部服務(如 Database 或 Redis 等),這樣不僅可以集中管理設定,也能夠隨時重置整個服務。
假設我們今天需要 PostgreSQL,我們可以用以下指令啟動一個 container
$ docker run --name database \
-p 5432:5432 \
-e POSTGRES_PASSWORD=secret
上述指令可以啟動一個 container
database
secret
對於日漸龐大的服務依賴,每次都要手動管理非常的麻煩。此時我們可以利用 docker-compose
去自動化管理各服務。
首先在專案根目錄建立一個 docker-compose.local.yml
version: '3'
services:
database:
image: postgres
ports:
- 5432:5432
environment:
POSTGRES_DB: laravel
POSTGRES_USER: homestead
POSTGRES_PASSWORD: secret
redis:
image: redis
ports:
- 6379
如此以來,使用 docker-compose up
就可以自動建立好兩個服務。
對於比較進階的用法(例如 mount volumes),請再自行查閱 Docker Compose 的文件。
各 Image 都有不同的 environment 設定,在使用之前最好先行查閱各 Image 的說明:
Laravel 所有的設定都位於 config/
資料夾下,建議先尋找要設定的值位於 config/
的何處。例如要連接資料庫,設定位於 config/database.php
。
<?php
// config/database.php
return [
'default' => 'mysql',
'connections' => [
// ...
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'artiv'),
'username' => env('DB_USERNAME', 'artiv'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
// ...
],
];
從這邊可以看到在 .env
中要如何設定,參考此數的 Key 再到 .env
中設定值即可。